/*
    The NeonX Library

    Copyright (c) 2013 darkcat

    Code covered by the MIT License
*/

#pragma once

// nx...
#include "config/general.h"
// NX_ALLOC
#include "memory/memalloc.h"
// TraitsContainer
#include "type/typetraits.h"

// std::map
#include <map>

//////////////////////////////////////////////////////////////////////////
NX_BEG
//////////////////////////////////////////////////////////////////////////

template <typename Key_, typename Type_, typename Comp_ = std::less<Key_>, class Alloc_ = NX_ALLOC>
class map : public std::map<Key_, Type_, Comp_, typename Alloc_::template Allocator<std::pair<const Key_, Type_> >::ret>
{
public:
    typedef std::map<Key_, Type_, Comp_, typename Alloc_::template Allocator<std::pair<const Key_, Type_> >::ret> base_t;

public:
    map()
        : base_t()
    {}
    map(const base_t& x)
        : base_t(x)
    {}

#ifdef NX_CC_MSVC
    explicit map(const Comp_& c,
                 const typename base_t::allocator_type& a = base_t::allocator_type())
        : base_t(c, a)
    {}
#elif defined(NX_CC_GNUC)
    explicit map(const Comp_& c,
                 const typename base_t::allocator_type& a = typename base_t::allocator_type())
        : base_t(c, a)
    {}
#endif

    template <typename Iterator_>
    map(Iterator_ f, Iterator_ l)
        : base_t(f, l)
    {}
    template <typename Iterator_>
    map(Iterator_ f,
        Iterator_ l,
        const Comp_& c,
        const typename base_t::allocator_type& a = typename base_t::allocator_type())
        : base_t(f, l, c, a)
    {}
};

/*
    Special TraitsContainer
*/

template <typename K_, typename T_, typename C_, class A_>
struct TraitsContainer<map<K_, T_, C_, A_> >
{
    typedef typename map<K_, T_, C_, A_>::value_type val_t;
    typedef typename map<K_, T_, C_, A_>::iterator   ite_t;
    typedef std::pair<K_, T_>                        pair_t;
};

//////////////////////////////////////////////////////////////////////////
NX_END
//////////////////////////////////////////////////////////////////////////
